#ifndef MCP23017_H
#define MCP23017_H

#include "ohos_types.h"

//-------------------------------定义MCP017内部寄存器地址------------------------------ 
#define MCP23017_IODIR 			0x00
#define MCP23017_IPOL 			0x02
#define MCP23017_GPINTEN 		0x04
#define MCP23017_DEFVAL 		0x06
#define MCP23017_INTCON 		0x08
#define MCP23017_IOCON 			0x0A
#define MCP23017_GPPU 			0x0C
#define MCP23017_INTF 			0x0E
#define MCP23017_INTCAP 		0x10
#define MCP23017_GPIO 			0x12
#define MCP23017_OLAT 			0x14
//-------------------------------定义MCP017内部寄存器地址------------------------------ 

//-------------------------------定义辅助宏定义---------------------------------------- 
#define MCP23017_PORTA			0x00
#define MCP23017_PORTB			0x01
//-------------------------------定义辅助宏定义---------------------------------------- 

//-------------------------------定义输入输出------------------------------------------
#define INPUT					0x01
#define OUTPUT					0x00
//-------------------------------定义输入输出------------------------------------------

//-------------------------------定义使能或除能----------------------------------------
#define ENABLE					0x01
#define DISABLE					0x00
#define SET						0x01
#define RESET					0x00
//-------------------------------定义使能或除能----------------------------------------

//-------------------------------定义是否对端口极性取反---------------------------------
//-------------------------------当设置为取反时，读取的端口状态与实际输入状态极性相反------
#define POLARITY_REVERSE		0x01
#define POLARITY_NON_REVERSE	0x00
#define PIN0					0x01
#define PIN1					0x02
#define PIN2					0x04
#define PIN3					0x08
#define PIN4					0x10
#define PIN5					0x20
#define PIN6					0x40
#define PIN7					0x80
#define ALLPIN					0xFF
//-------------------------------定义是否对端口极性取反---------------------------------

//-------------------------------定义中断的类型----------------------------------------
#define DIS_INTERRUPT			0x00	   //关闭中断
#define HIGHLEVEL_INTERRUPT		0x01       //高电平中断	   
#define LOWLEVEL_INTERRUPT		0x02       //低电平中断	   
#define CHANGE_INTERRUPT		0x03	   //电平变化中断
//-------------------------------定义中断的类型----------------------------------------

//-------------------------------定义INTA、INTB是否关联--------------------------------
#define INTA_INTB_CONJUNCTION	0x00	    //AB关联
#define INTA_INTB_INDEPENDENT	0x01        //AB独立
//-------------------------------定义INTA、INTB是否关联--------------------------------

//-------------------------------定义硬件地址是否使能----------------------------------
#define HWA_EN					0x00	    //A0、A1、A2、硬件地址使能
#define HWA_DIS					0x01        //A0、A1、A2、硬件地址禁用
//-------------------------------定义硬件地址是否使能----------------------------------

//-------------------------------定义INTA、INTB引脚的输出类型--------------------------
#define INT_OD					0x00	   
#define INT_PUSHPULL_HIGH		0x01	   
#define INT_PUSHPULL_LOW		0x02	 
//-------------------------------定义INTA、INTB引脚的输出类型--------------------------

#define I2C_READ      0x01      // 读指令代码
#define I2C_WRITE     0x00      // 写指令代码
#define DRIVER_ID     0x40 	    // 地址

#define MCP23017_I2C_IDX 1
#define MCP23017_I2C_ADDRESS 0x40

//初始化指定地址的MCP23017器件
int MCP23017_INIT(uint8 deviceAddr,uint8 intab,uint8 hwa,uint8 o);
//设置制定地址的MCP23017的指定端口的指定引脚为输入或输出状态
int MCP23017_IO_DIR(uint8 deviceAddr,uint8 port,uint8 pin,uint8 dir);
//设置指定地址的MCP23017的指定端口的指定引脚是否开启上拉电阻
int MCP23017_IO_PU(uint8 deviceAddr,uint8 port,uint8 pin,uint8 pu);
//设置指定地址的MCP23017的指定端口的指定引脚是否对端口极性取反
int MCP23017_IO_POLARITY(uint8 deviceAddr,uint8 port,uint8 pin,uint8 polarity);
//设置指定地址的MCP23017的指定端口的指定引脚是否开启中断功能及中断的类型
int MCP23017_IO_INT(uint8 deviceAddr,uint8 port,uint8 pin,uint8 intKind);
//读取指定地址的MCP23017的指定端口的中断标志寄存器
uint8 MCP23017_READ_INTF(uint8 deviceAddr,uint8 port);
//读取指定地址的MCP23017的指定端口发生中断时中断捕捉寄存器捕捉到的端口值
uint8 MCP23017_READ_INTCAP(uint8 deviceAddr,uint8 port);
//读取指定地址的MCP23017的指定端口值
uint8 MCP23017_READ_GPIO(uint8 deviceAddr,uint8 port);
//向指定地址的MCP23017的指定端口写值
int MCP23017_WRITE_GPIO(uint8 deviceAddr,uint8 port,uint8 val);
//设置指定地址的MCP23017的指定端口的指定引脚
int MCP23017_SET_GPIO_PIN(uint8 deviceAddr,uint8 port,uint8 pin,uint8 s);
//读取指定地址的MCP23017的指定端口的输出锁存寄存器
uint8 MCP23017_READ_OLAT(uint8 deviceAddr,uint8 port);
//写指定地址的MCP23017的指定端口的输出锁存寄存器
int MCP23017_WRITE_OLAT(uint8 deviceAddr,uint8 port,uint8 val);
//从指定地址的MCP23017器件的指定寄存器读一字节数据
int I2C_Read_Byte_MCP23017(uint8 deviceAddr, uint8 regAddress, uint8* recv);
//向指定地址的MCP23017器件的指定寄存器写一字节数据
int I2C_Write_Byte_MCP23017(uint8 deviceAddr, uint8 regAddress, uint8 content);

#endif